const { program } = require('commander')
const template = require('art-template')
const path = require('path')
const fs = require('fs')
const { exit } = require('process')
program
  .version('1.0.0')
  .requiredOption('-f, --fileName <type>', '文件名称')
  .option('-d, --debug <type>', '开启调试模式', 1)
  .option('-co, --covered <type>', '是否覆盖(1->覆盖,0->不覆盖)', 0)
  .parse(process.argv)

// 原始语法的界定符规则
template.defaults.rules[0].test = /<%(#?)((?:==|=#|[=-])?)[ \t]*([\w\W]*?)[ \t]*(-?)%>/
// 标准语法的界定符规则(默认的开始结束标签为{{和}}，与vue的模板语法有冲突，所以修改一下<{ }>)
template.defaults.rules[1].test = /<{([@#]?)[ \t]*(\/?)([\w\W]*?)[ \t]*}>/
// 设置模板引擎调试模式
template.defaults.debug = (program.debug === 1 || program.debug === '1')
// 禁止压缩
template.defaults.minimize = false

// 入口生成代码
main()


function main() {
  var reg = /^[a-z][a-z_]{1,16}[a-z]$/
  var fileName = program.fileName
  if(!reg.test(fileName)) {
    console.log(`${fileName}不合法，文件名应采用下划线命名规则`)
    exit();
  }
  var className = toHump(fileName);
  var contractFileName = `${fileName}_contract.dart`
  var pageFileName = `${fileName}.dart`
  var pImpl = `${fileName}_presenter_impl.dart`
  var data = {
    "moduleName": fileName,
    "fileName": fileName,
    "className": className
  }
  var targetPath = path.join(__dirname, `../lib/modules/${fileName}`);
  if(!fs.existsSync(targetPath)){
    mkdirs(targetPath)
  }
  // 生成contract
  var content = template(path.join(__dirname, `templates/contract.art`), data)
  var targetFile = path.join(targetPath, contractFileName)
  if (fs.existsSync(targetFile)) {
    if (program.covered === 1 || program.covered === '1') {
      log(`目标文件－被覆盖：${targetFile}`)
      writeFile(content, targetFile)
    } else {
      log(`目标文件－已存在：${targetFile}`)
    }
  } else {
    log(`目标文件－新生成：${targetFile}`)
    writeFile(content, targetFile)
  }
  // 生成 page
  content = template(path.join(__dirname, `templates/page.art`), data)
  targetFile = path.join(targetPath, pageFileName)
  if (fs.existsSync(targetFile)) {
    if (program.covered === 1 || program.covered === '1') {
      log(`目标文件－被覆盖：${targetFile}`)
      writeFile(content, targetFile)
    } else {
      log(`目标文件－已存在：${targetFile}`)
    }
  } else {
    log(`目标文件－新生成：${targetFile}`)
    writeFile(content, targetFile)
  }
  // 生成 presenter_impl
  content = template(path.join(__dirname, `templates/presenter_impl.art`), data)
  targetFile = path.join(targetPath, pImpl)
  if (fs.existsSync(targetFile)) {
    if (program.covered === 1 || program.covered === '1') {
      log(`目标文件－被覆盖：${targetFile}`)
      writeFile(content, targetFile)
    } else {
      log(`目标文件－已存在：${targetFile}`)
    }
  } else {
    log(`目标文件－新生成：${targetFile}`)
    writeFile(content, targetFile)
  }
}

/**
 * 下划线 to 大驼峰
 * @param {*} name 
 */
function toHump(name) {
  var s =  name.replace(/\_(\w)/g, function(all, letter){
    return letter.toUpperCase();
  });
  return s.charAt(0).toUpperCase() + s.slice(1)
}
/**
 * 写文件
 * @param {*} content
 * @param {*} targetFile
 */
function writeFile(content, targetFile) {
  fs.writeFile(targetFile, content, {}, (err) => {
    if (err) {
      log(err)
    }
  })
}
/**
 * 创建多级目录
 * @param {} dirpath
 */
function mkdirs(dirpath) {
  if (!fs.existsSync(path.dirname(dirpath))) {
    mkdirs(path.dirname(dirpath))
  }
  fs.mkdirSync(dirpath)
}
/**
 * 日志打印
 * @param {} msg 打印的消息
 */
function log(msg) {
  if (program.debug === 1 || program.debug === '1') {
    console.log(msg)
  }
}